package stack;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * 逆波兰表达式计算机案例
 */
public class PolandNotation {
    public static void main(String[] args) {
        //先定义一个逆波兰表达式
        //(3+4)*5-6  => 3 4 + 5 * 6 -
        //为了方便，用空格隔开
//        String suffixExpression = "3 4 + 5 * 6 -";
        String suffixExpression = "3 4 + 7 * 5 -";
        //思路
        //1.先将表达式放到ArryList中
        //2.将ArryList 传递给一个方法，配合栈，完成计算

        List<String> rpnList = getListString(suffixExpression);
        System.out.println("运算结果为："+calculate(rpnList));


    }

    //将表达式中的数据放入到ArryList中
    public static List<String> getListString (String suffixExpression){
        //先将表达式分隔
        String[] split = suffixExpression.split(" ");
        ArrayList<String> List = new ArrayList<String>();
        for(String ele:split){
            List.add(ele);
        }
        return List;
    }

    //完成逆波兰表达式的步骤
    public static int calculate(List<String> ls){
        //创建一个栈
        Stack<String> stack = new Stack<String>();
        //遍历List
        for(String item:ls){
            //判断是不是数
            //使用正则表达式
            if(item.matches("\\d+")){  //匹配多位数
                //入栈
                stack.push(item);
            }else{
                //pop出两个数，进行运算
                int num2 = Integer.parseInt(stack.pop());
                int num1 = Integer.parseInt(stack.pop());
                int res = 0; //定义一个结果变量

                if(item.equals("+")){
                    res = num1 + num2;
                }else if(item.equals("-")){
                    res = num1 - num2;
                }else if(item.equals("*")){
                    res = num1 * num2;
                }else if(item.equals("/")){
                    res = num1 / num2;
                }else {
                    System.out.println("运算符出错");
                }
                //运算完以后，将res入栈
                stack.push(res+"");
            }
        }

        //最后留在栈中的数据就是结果
        return Integer.parseInt(stack.pop());
    }

}
